#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time      :2021/3/26 16:22
# @Author    :cjw
"""
协程：当程序遇见了IO操作的时候，可以选择性的切换到其它任务上
在微观上是一个任务一个任务的进行切换，切换条件一般就是IO操作
在宏观上，我们能看到的其实是多个任务一起执行
多任务操作

上方所讲的一切，都是在单线程的条件下
"""
import asyncio
import time


async def func1():
	print('Hello async001')
	# time.sleep(2)  # 当程序出现了同步操作时，异步就中断了
	await asyncio.sleep(2)
	print('Hello async001')


async def func2():
	print('Hello async002')
	# time.sleep(4)
	await asyncio.sleep(4)
	print('Hello async002')


async def func3():
	print('Hello async003')
	await asyncio.sleep(3)
	print('Hello async003')


async def main():
	# # 第一种写法
	# f1 = func1()
	# await f1  # 一般await挂起操作放在协程对象前面

	# 第二种写法(推荐)
	tasks = [
		asyncio.create_task(func1()),  # python 3.8 以后需要加上asyncio.create_task
		asyncio.create_task(func2()),
		asyncio.create_task(func3())
	]
	await asyncio.wait(tasks)


if __name__ == '__main__':
	# f1 = func1()  # 此时的函数是异步协程函数，此时函数执行得到的是一个协程对象
	# f2 = func2()
	# f3 = func3()
	# task = [f1, f2, f3]
	t1 = time.time()
	asyncio.run(main())  # 协程程序运行需要asyncio模块的支持, 固定搭配写法
	t2 = time.time()
	print(f'执行耗费时间: {t2 - t1}')
